import { Inject, Injectable } from '@angular/core';
import { Observable } from 'rxjs/internal/Observable';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { map } from 'rxjs/operators';
import IUser from '../pojo/IUser';
import base_url from '../http/base';
import { Subject } from 'rxjs';
import IResult from '../pojo/IResult';
import { USERInjectionToken } from './user.token';
@Injectable({
  providedIn: 'root'
})
export class UserService {

  private headers = new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded');

  // 用 InjectionToken 和一个服务 中 用户登录后 是如何把用户信息保存在InjectionToken 中
  // private user:IUser;
  constructor(private http: HttpClient, @Inject(USERInjectionToken) private user: IUser | null) {
    // this.user = Inject(USERInjectionToken);
  }

  get isLoggedIn(): boolean {
    return !!this.user;
  }

  getUser(): IUser | null {
    return this.user;
  }

  setUser(user: IUser | null): void {
    this.user = user;
  }


  // 获取用户信息
  login(payload: string): Observable<IResult> {
    return this.http.post<IResult>(
      base_url.usersystemurl + 'login',
      payload,
      { headers: this.headers }
    )
  }


  // 获取用户列表信息
  getUsers(payload: string): Observable<IUser[]> {
    return this.http.post<IUser[]>(
      base_url.usersystemurl + 'getUsers',
      payload,
      { headers: this.headers }
    )
  }
  // 获取用户信息
  getUsersByName(payload: string): Observable<IUser[]> {
    return this.http.post<IUser[]>(
      base_url.usersystemurl + 'getUsersByName',
      payload,
      { headers: this.headers }
    )
  }
  // 获取用户信息
  getUsersById(payload: string): Observable<IUser[]> {
    return this.http.post<IUser[]>(
      base_url.usersystemurl + 'getUsersById',
      payload,
      { headers: this.headers }
    )
  }


  // 追加更新删除用户信息
  addupdateSaveUser(payload: string, flag: string): Observable<IResult> {
    let action = ""
    // flag: string = ""; // 0:添加；1：编辑；2：删除
    if (flag == "0") {
      action = base_url.usersystemurl + "addSaveUserData";
    }
    else if (flag == "1") {
      action = base_url.usersystemurl + "updateSaveUserData";
    }
    else {
      action = base_url.usersystemurl + "delete";
    }
    return this.http.post<IResult>(
      action,
      payload,
      { headers: this.headers }
    )
  }


  // 创建一个可观察对象
  // public updateNeeded$ = new Subject<IUser[]>();
  // public userObservable:Subject<IUser[]>|undefined;
  //  getUsers(payload: any): Observable<IUser[]> {
  //   return this.http.post<IUser[]>(
  //     base_url.url + '/user/getUsers',
  //     payload,
  //     { headers: this.headers }
  //   ).pipe(
  //     map(res => {
  //       return res;
  //     })
  //   );
  // }
  // pipe是RxJS库中的一个非常重要的函数，用于连接一系列的流操作符（如map, filter, switchMap, tap等），
  // 从而形成复杂的数据处理流程。pipe函数允许你以一种清晰且易于维护的方式组合这些操作符，
  // 而不是使用嵌套的链式调用，这在处理异步数据流时尤其有用。在RxJS中，pipe是一个高阶函数，
  // 它接受一个或多个操作符作为参数，并返回一个新的操作符，这个操作符可以应用于Observable。
  // 当应用于Observable时，pipe返回的复合操作符会按顺序应用到Observable发出的每个值上，
  // 从而实现数据的转换、过滤、映射等功能。
}